IoT Coreに来たデータをAmazon Timestreamに保存してみる
IoTにおいて、次のような要件(ニーズ)は多いと思います。
- デバイスから来たデータを時系列に取得したい
- デバイス毎、時間毎、といった検索をしたい
- リアルタイムなデータ分析を行いたい
これまでは、DynamoDBに保存してquery()
で取得するなどなど頑張っていましたが、Amazon Timestreamを使うと簡単にできるようになります。SQLが使えますからね!
本記事では、IoT Coreで受け取ったデータをAmazon Timestreamに保存してみました。
仕様を決める
ここでは、IoTデバイスとして河川にある水位センサーを想定します。 水位センサーは一定期間毎にIoT Coreにデータを送信しています。
- データ詳細:下記のJSON
- 水位(メートル):waterLevel
- 時刻(ミリ秒):timestamp
{ "waterLevel": 10, "timestamp": 1601258079088 }
- MQTTトピック:
sample/<デバイスID>/waterLevel
Amazon Timestreamの準備をする
データベースを作成する
Standard database
を選択します。
- データベース名:IoT-Sample-Database
テーブルを作成する
さきほど作成したデータベースにテーブルを追加します。
- テーブル名:water-level-table
- メモリストア保持:1日
- 磁気ストア保持:7日
この時点ではデータ0件
クエリ実行してみると、結果は0件です。
SELECT * FROM "IoT-Sample-Database"."water-level-table" ORDER BY time DESC LIMIT 10
IoT Ruleアクションを作成する
ルールクエリステートメント
SELECT waterLevel FROM 'sample/+/waterLevel'
アクション
「Timestreaテーブルにメッセージを書き込む」があるので選択します。
データベースとテーブルは、さきほど作成したものを選択します。
ディメンションはKey-Valueの関係です。
ディメンション名 | ディメンション値 |
---|---|
deviceId | ${topic(2)} |
timestamp | ${timestamp} |
最後にIAMロールを作成します。
IoT Coreにデータを送信する
IoT Coreのテスト画面を使ってデータを送信します。
- MQTTトピック:
sample/w0001/waterLevel
{ "waterLevel": 10, "timestamp": 1601529491031 }
Amazon Timestreamのデータを確認する
シンプルなデータ取得
さきほど送信したデータを取得できました!
SELECT * FROM "IoT-Sample-Database"."water-level-table" ORDER BY time DESC LIMIT 10
複数のデータを追加で送信し、再度データ取得するとバッチリ増えました!
デバイスIDを指定してデータ取得
デバイスIDを指定してデータ取得もできますね。
SELECT * FROM "IoT-Sample-Database"."water-level-table" WHERE deviceId = 'w0001' ORDER BY time DESC LIMIT 10
デバイスIDと時刻を指定してデータ取得
特定のデバイスについて、StartとEndの時刻を指定して、データ取得してみました。
- 1601529480000 : 2020-10-01T14:18:00
- 1601529720610 : 2020-10-01T14:22:00
SELECT * FROM "IoT-Sample-Database"."water-level-table" WHERE deviceId = 'w0001' AND timestamp BETWEEN '1601529480000' AND '1601529720610' ORDER BY time DESC LIMIT 10
さいごに
お手軽にできました。データ検索でSQLが使えるのは強いですね……!